﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using HA.ModFlow.Infrastructure;

namespace HA.ModFlow.Domain.DomainLayer
{
    /// <summary>
    /// 设计用于读取modflow的输出结果
    /// </summary>
    
    
    //public class MFFileReader
    //{

    //    public MFFileReader()
    //    {
    //        this._heads = new List<Grid3dValue>();

    //        this._dropdowns = new List<Grid3dValue>();
    //    }
  

    //    public List<double[]> GetReslutData(int Count, string FileName)
    //    {
    //        List<double[]> ArryResultData = new List<double[]>();
    //        if (System.IO.File.Exists(FileName))
    //        {
    //            //try
    //            //{
    //                using (StreamReader mReader = new StreamReader(FileName))
    //                {
                      
    //                    int mLen = 11;//截取的字符数                       
    //                    while (mReader.Peek() >= 0)
    //                    {
    //                        string mStr = mReader.ReadLine();

    //                        //==============================
    //                        //int P = HAUtil.FileImporter.GetStringNumber(mStr, " ");
    //                        double[] arry = new double[Count];


    //                        int X=10;
    //                        int Y=1;
    //                        int C = 0;
    //                        if (mStr.Trim() != "")
    //                        {
    //                            for (int i = 0; i < Count; i++)
    //                            {
    //                                if ((i) < X * Y)
    //                                {
    //                                    string str = mStr.Substring(C * mLen, mLen);
    //                                    arry[i] = Convert.ToDouble(str);
    //                                    C++;
    //                                }
    //                                else
    //                                {
    //                                    Y++;
    //                                    mStr = mReader.ReadLine();
    //                                    C = 0;
    //                                    string str = mStr.Substring(C * mLen, mLen);
    //                                    C++;
    //                                    arry[i] = Convert.ToDouble(str);
    //                                }
    //                            }
    //                        }
    //                        ArryResultData.Add(arry);
    //                    }
    //                }
    //            //}
    //            //catch
    //            //{
    //            //    return null;
    //            //}
    //        }
    //        else
    //        {
    //            return null;
    //        }

    //        return ArryResultData;

    //    }


    //    /// <summary>
    //    /// 总的对外接口函数   文件大小 0 kb 或者读取过程出错 返回的 List<Grid3dValue> 的 Count =0
    //    /// </summary>
    //    /// <param name="path">文件路径（不包括文件名和后缀）</param>
    //    /// <param name="i">主网格 RowsNumber</param>
    //    /// <param name="j">主网格 ColsNumber</param>
    //    /// <param name="k"> 主网格 LayerNumber</param>
    //    /// <param name="nPeriods">应力期总个数</param>
    //    /// <param name="stressPeriodNSTP">各应力期的时间步数</param>
    //    /// <param name="oc">应力期输出类型</param>
    //    public void ReadOutputResult(string path, int i, int j, int k, int nPeriods, List <int> stressPeriodNSTP,OutputControl oc)
    //    {

    //        //以 15*15*3 的网格 ；总共 4 个应力期 ；每个应力期 时间步数都为 10   ；输出所有时间步数应力期；输出格式 _10G11_4。

    //        #region 定义一些控制信息

    //        int mLen = 11;//每个完整的数据占11位  包括负号的情况
    //        int maxLength = 10;//默认每行最多有10个完整数据


    //        //总共需要的网格数

    //        int gridNumber=0;

    //        //如果是应力期每个步长输出
    //        //gridNumber=第一个应力期时间步数 + 第二个应力期时间步数 + 第三个应力期时间步数 + 第四个应力期时间步数 
    //        //如果是应力期输出最后一个步长
    //        //gridNumber=应力期总的个数

    //        if (oc.IsAllStepOutput == true)
    //        {
    //            for (int nstp = 0; nstp < stressPeriodNSTP.Count; nstp++)
    //            {
    //                gridNumber = gridNumber + stressPeriodNSTP[nstp];
    //            }
    //            //共有 40 个网格
    //        }
    //        else
    //        {
    //            gridNumber = nPeriods;
    //            //共有4个网格
            
    //        }

          


    //        //网格每个I（Row）在文件中占多少行
    //        //默认设置 _10G11_4   每行最多10个完整数据，每个数据占11位，显示4位小数，例如：-0.2166E-02
    //        if (j <= 10)
    //        {
    //            //1行  
    //        }
    //        if (10 < j && j <= 20)
    //        {
    //            //2行 
    //        }
    //        //类推  有待验证
    //        double result = j* 0.1;//默认每行最多 10 个完整数据 所以乘以 0.1
    //        int lineNum = (int)Math.Ceiling(result);
    //        //占 2 行


    //        //网格每层在文件中站多少行
    //        int layerLineNumber = 0;
    //        //layerLineNumber= I（RowsNumber）* 网格每个I（Row）在文件中占行

    //        layerLineNumber = lineNum * i;
    //        //30 行


    //        //每个网格在文件站多少行

    //        int gridLineNumber = 0;
    //        //gridLineNumber=layerLineNumber*K;
    //        gridLineNumber = layerLineNumber * k;
    //        //90 行



    //        //文件总的数据行数

    //        int fileLineNumber=0;
    //        //fileLineNumber=gridLineNumber * gridNumber(应力期总个数)
    //        fileLineNumber = gridLineNumber * gridNumber;
    //        //3600 行



    //        #endregion


    //        //从文件读取数据

    //        string FileName = path + "IHEDUN.dat";

    //        if (System.IO.File.Exists(FileName))
    //        {
    //            StreamReader sr = new StreamReader(FileName);

    //            try
    //            {                
            

    //                _heads.Clear();

    //                for (int gnum = 0; gnum < gridNumber; gnum++)//总共多少个网格的数据
    //                {
    //                    Grid3dValue Grid3d = new Grid3dValue(i, j, k);
    //                    //从文件中读取对应网格的信息

    //                    int row = 0;
    //                    int col = 0;
    //                    int layer = 0;


    //                    #region 从文件读取网格信息  按照逐个网格的方式处理

    //                    int reanLineNumber = 0;//记录读取某一个网格的时候，从文件中读取的总行数，用以判断读取一个网格的数据是否结束

    //                    int readEndColNum = 0;//每个I（Row）占多行时，记录读取的局部行数，用以判断读取I（Row）是否结束

    //                    //下面使用 do   while  循环  读取数据，while中负责判断是否读到文件末尾或是否读完了一个网格的数据

    //                    string str = null;

    //                    do
    //                    {
    //                        //循环读取一个网格的数据信息

    //                        str = sr.ReadLine();

    //                        reanLineNumber = reanLineNumber + 1;


    //                        if (str == null)
    //                        {
    //                            _heads.Clear();

    //                            break;//当文件中间有空行不是连续的数据的时候  表示文件被破坏
    //                            //continue;
    //                        }
    //                        if (str.Trim() == "")
    //                        {
    //                            _heads.Clear();

    //                            break;//当文件中间有空行不是连续的数据的时候  表示文件被破坏
    //                            //continue;
    //                        }
    //                        if (lineNum <= 1)//网格每个I（Row）在文件中占1行
    //                        {
    //                            #region

    //                            for (int index = 0; index < j; index++)
    //                            {
    //                                //遍历读取完整数据 

    //                                string colStr = str.Substring(index * mLen, mLen);

    //                                double rowColData = Convert.ToDouble(colStr);

    //                                Grid3d.Datas[row, index, layer] = rowColData;


    //                            }
    //                            if (row + 1 >= i)//判断是否读完了一层
    //                            {
    //                                row = 0;
    //                                layer = layer + 1;//改变层的标记
    //                            }
    //                            else
    //                            {
    //                                row = row + 1;//记录正在读取网格的哪一个Row
    //                            }

    //                            #endregion

    //                        }
    //                        else
    //                        {
    //                            readEndColNum = readEndColNum + 1;//个数
    //                            if (readEndColNum > lineNum)//I（Row）对应的数据读完，进入下一个Row
    //                            {
    //                                row = row + 1;
    //                                col = 0;
    //                                readEndColNum = 1;
    //                            }
    //                            if (row + 1 > i)//判断是否读完了一层
    //                            {
    //                                row = 0;
    //                                col = 0;
    //                                layer = layer + 1;//改变层的标记
    //                            }
    //                            //else
    //                            //{
    //                            //    row = row + 1;//记录正在读取网格的哪一个Row
    //                            //    col = 0;
    //                            //}


    //                            if (readEndColNum == lineNum)
    //                            {
    //                                for (int index = 0; index < j - (lineNum - 1) * maxLength; index++)
    //                                {
    //                                    //遍历读取完整数据 

    //                                    string colStr = str.Substring(index * mLen, mLen);

    //                                    double rowColData = Convert.ToDouble(colStr);

    //                                    Grid3d.Datas[row, col, layer] = rowColData;

    //                                    col = col + 1;

    //                                }

    //                            }
    //                            else
    //                            {
    //                                for (int index = 0; index < maxLength; index++)
    //                                {
    //                                    //遍历读取完整数据 

    //                                    string colStr = str.Substring(index * mLen, mLen);

    //                                    double rowColData = Convert.ToDouble(colStr);

    //                                    Grid3d.Datas[row, col, layer] = rowColData;

    //                                    col = col + 1;
    //                                }

    //                            }

    //                            #region


    //                            #endregion

    //                        }




    //                    }
    //                    while (sr.EndOfStream != true && reanLineNumber < gridLineNumber);


    //                    #endregion 从文件读取网格信息 结束


    //                    if (str == null)
    //                    {
    //                        break;
    //                    }
    //                    else if (str.Trim() == "")
    //                    {
    //                        break;
    //                    }
    //                    else
    //                    {
    //                     _heads.Add(Grid3d);
    //                    }


    //                }//  for (int gnum = 0; gnum < gridNumber; gnum++)//总共多少个网格的数据  结束



    //                sr.Close();

    //            }
    //            catch (Exception)
    //            {
    //                System.Windows.Forms.MessageBox.Show("读取结果文件出错了！-_- 哈哈");

    //                _heads.Clear();

    //                sr.Close();

    //                return;
    //            }





    //        }




    //        #region 旧的方法 未使用 留作参考

    //        //List<double[]> arry = GetReslutData(j, path);
    //        //_heads.Clear();

    //        //for (int C = 0; C < nPeriods; C++) //应力期
    //        //{
    //        //    Grid3dValue Grid3d = new Grid3dValue(i, j, k);
    //        //    int X = 0;
    //        //    int Z = 0;
    //        //    for (int P = 0; P < arry.Count; P++)
    //        //    {
    //        //        //每i行J列一层数据
    //        //        for (int Y = 0; Y < arry[P].Length; Y++)
    //        //        {
    //        //            Grid3d.Datas[X, Y, Z] = arry[P][Y];
    //        //        }
    //        //        X++;
    //        //        if (P >= i)
    //        //        {
    //        //            X = 0;
    //        //            Z++;
    //        //        }
    //        //    }
    //        //    _heads.Add(Grid3d);
    //        //}


    //        #endregion




    //    }


    //    List<Grid3dValue> _heads;

    //    public List<Grid3dValue> Heads
    //    {
    //        get { return _heads; }
    //        set { _heads = value; }
    //    }
    //    List<Grid3dValue> _dropdowns;

    //    public List<Grid3dValue> Dropdowns
    //    {
    //        get { return _dropdowns; }
    //        set { _dropdowns = value; }
    //    }


    //}


}
